// function firstElement(arr: any[]) {
//     return arr[0];
// }

function firstElement<Type>(arr: Type[]): Type | undefined {
    return arr[0];
}

firstElement([1]);
firstElement(['1']);

function map<Input, Output>(arr: Input[], func: (arg: Input) => Output) {
    return arr.map(func);
}

map(['1', '2', '3'], (n) => parseInt(n))

function longest<Type extends { length: number }>(a: Type, b: Type) {
    if (a.length > b.length) {
        return a;
    }

    return b;
}

longest('1', '2');
longest([], [1]);
// longest(1, 2); // 类型“number”的参数不能赋给类型“{ length: number; }”的参数。

// function mininumLength<Type extends { length: number }>(
//     obj: Type,
//     mininum: number
// ): Type {
//     if (obj.length > mininum) {
//         return obj;
//     } else {
//         return { length: mininum }
//     }
// }

function combine<Type>(arr1: Type[], arr2: Type[]) {
    return arr1.concat(arr2);
}

combine([1, 2 , 3], [4, 5, 6]);
combine<string | number>([1, 2 , 3], ['4', '5', '6']);